package it.fc.service.db.manager;

import it.fc.bean.GiocatoriBean;
import it.fc.bean.SquadraBean;
import it.fc.exceptions.FcException;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.log4j.Logger;

public class DbSquadreManager extends DbManager {

    /**
     * Manage squadre
     */

    private static Logger log = Logger.getLogger(DbSquadreManager.class);

    public int insertSquadra(int idUser, String nome) throws FcException {

        Connection conn = null;
        int idSquadra = 0;

        try {
            StringBuffer strBuf = new StringBuffer();
            strBuf.append("INSERT INTO SQUADRE (NOME,IDUSER) VALUES('");
            strBuf.append(nome);
            strBuf.append("',");
            strBuf.append(idUser);
            strBuf.append(");");

            conn = getConnection();
            Statement stm = conn.createStatement();

            log.debug("exec : " + strBuf);
            stm.execute(strBuf.toString());

            ResultSet res = stm.executeQuery("SELECT LAST_INSERT_ID();");

            if (res.next()) {
                idSquadra = res.getInt(1);
            }

            log.debug("IdSquadra >>  " + idSquadra);
        } catch (SQLException e) {
            log.error("Errore in insertCalciatori >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in insertCalciatori(closeConn) >> " + e.getMessage());
            }
        }

        return idSquadra;
    }

    public int insertCalciatori(int idSquadra, List<Integer> calciatori) throws FcException {

        DbCalciatoriManager calciatoriManager = new DbCalciatoriManager();
        int budget = 0;
        String query = "INSERT INTO SQUADRA_CALCIATORI(IDSQUADRA,IDCALCIATORE) VALUES (?,?)";

        Connection conn = null;

        try {
            conn = getConnection();
            PreparedStatement prepStm = conn.prepareStatement(query);

            Iterator<Integer> it = calciatori.iterator();
            while (it.hasNext()) {
                int idCurrent = it.next();
                int costo = ((GiocatoriBean) calciatoriManager.findCalciatore(idCurrent)).getIdgiocatore();
                budget = costo + budget;
                prepStm.setInt(1, idSquadra);
                prepStm.setInt(2, idCurrent);
                prepStm.execute();
            }

            log.debug("Inserimento giocatori per la squadra : " + idSquadra + " effettuato!");
        } catch (SQLException e) {
            log.error("Errore in insertCalciatori >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in insertCalciatori(closeConn) >> " + e.getMessage());
            }
        }

        return budget;
    }

    public List<GiocatoriBean> getSquadra(int idUSer, String role) throws FcException {

        Connection conn = null;
        List<GiocatoriBean> giocatori = new ArrayList<GiocatoriBean>();

        try {
            conn = getConnection();
            StringBuffer strBuf = new StringBuffer();
            strBuf.append("SELECT GIOCATORE.IDGIOCATORE, GIOCATORE.NOME ");
            strBuf.append("FROM UTENTI, SQUADRE, SQUADRA_CALCIATORI, GIOCATORE ");
            strBuf.append("WHERE UTENTI.ID = SQUADRE.IDUSER ");
            strBuf.append("AND SQUADRE.ID = SQUADRA_CALCIATORI.IDSQUADRA ");
            strBuf.append("AND SQUADRA_CALCIATORI.IDCALCIATORE = GIOCATORE.IDGIOCATORE ");
            strBuf.append("AND GIOCATORE.RUOLO = '");
            strBuf.append(role);
            strBuf.append("' AND UTENTI.ID =" + idUSer);

            Statement stm = conn.createStatement();
            ResultSet res = stm.executeQuery(strBuf.toString());

            while (res.next()) {
                GiocatoriBean giocatore = new GiocatoriBean();
                giocatore.setNome(res.getString("nome"));
                giocatore.setIdgiocatore(res.getInt("idgiocatore"));
                giocatori.add(giocatore);
            }

        } catch (SQLException e) {
            log.error("Errore in insertCalciatori >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in insertCalciatori(closeConn) >> " + e.getMessage());
            }
        }

        return giocatori;
    }

    
    public List<GiocatoriBean> getSquadra(int idUSer) throws FcException {

        Connection conn = null;
        List<GiocatoriBean> giocatori = new ArrayList<GiocatoriBean>();

        try {
            conn = getConnection();
            StringBuffer strBuf = new StringBuffer();
            strBuf.append("SELECT GIOCATORE.IDGIOCATORE, GIOCATORE.NOME ");
            strBuf.append("FROM UTENTI, SQUADRE, SQUADRA_CALCIATORI, GIOCATORE ");
            strBuf.append("WHERE UTENTI.ID = SQUADRE.IDUSER ");
            strBuf.append("AND SQUADRE.ID = SQUADRA_CALCIATORI.IDSQUADRA ");
            strBuf.append("AND SQUADRA_CALCIATORI.IDCALCIATORE = GIOCATORE.IDGIOCATORE ");
            strBuf.append("AND UTENTI.ID =" + idUSer);

            Statement stm = conn.createStatement();
            ResultSet res = stm.executeQuery(strBuf.toString());

            while (res.next()) {
                GiocatoriBean giocatore = new GiocatoriBean();
                giocatore.setNome(res.getString("nome"));
                giocatore.setIdgiocatore(res.getInt("idgiocatore"));
                giocatori.add(giocatore);
            }

        } catch (SQLException e) {
            log.error("Errore in insertCalciatori >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in insertCalciatori(closeConn) >> " + e.getMessage());
            }
        }

        return giocatori;
    }
    
    public SquadraBean getSquadraByUser(int idUser) throws FcException {

        SquadraBean squadra = null;
        Connection conn = null;

        try {
            conn = getConnection();
            String query = "SELECT * FROM SQUADRE WHERE IDUSER = " + idUser;
            Statement stm = conn.createStatement();
            ResultSet res = stm.executeQuery(query);

            if (res.next()) {
                squadra = new SquadraBean();
                squadra.setIdUser(res.getInt("idUser"));
                squadra.setNome(res.getString("nome"));
                squadra.setIdSquadra(res.getInt("id"));
            }

        } catch (SQLException e) {
            log.error("Errore in getUsers >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in getUsers(closeConn) >> " + e.getMessage());
            }
        }

        return squadra;

    }

    public SquadraBean getSquadraByName(String name) throws FcException {

        SquadraBean squadra = null;
        Connection conn = null;

        try {
            conn = getConnection();
            String query = "SELECT * FROM SQUADRE WHERE NOME = '" + name + "'";
            Statement stm = conn.createStatement();
            ResultSet res = stm.executeQuery(query);

            if (res.next()) {
                squadra = new SquadraBean();
                squadra.setIdUser(res.getInt("idUser"));
                squadra.setNome(res.getString("nome"));
                squadra.setIdSquadra(res.getInt("id"));
                log.debug("Load getSquadraByName () " + squadra.getNome());
            }

        } catch (SQLException e) {
            log.error("Errore in getSquadraByName >> " + e.getMessage());
            throw new FcException(e);
        } finally {
            try {
                conn.close();
                log.debug("Connection close");
            } catch (SQLException e) {
                log.error("Errore in getSquadraByName(closeConn) >> " + e.getMessage());
            }
        }

        return squadra;

    }

}
